package ar.edu.phm.tp.cuatro.planificacionDsl.validation

import ar.edu.phm.tp.cuatro.planificacionDsl.planificacion.Asignacion
import ar.edu.phm.tp.cuatro.planificacionDsl.planificacion.PlanificacionPackage
import org.eclipse.emf.ecore.EAttribute
import org.eclipse.xtext.validation.Check

class AsignacionValidator extends AbstractPlanificacionValidator {
	public static val HORARIO_DE_ASIGNACION_INVALIDO = "HORARIO_DE_ASIGNACION_INVALIDO"
	public static val HORA_INICIO_MAYOR_IGUAL_HORA_FIN = "HORA_INICIO_MAYOR_IGUAL_HORA_FIN"
	public static val AULA_NO_CUMPLE_REQUERIMIENTOS = "AULA_NO_CUMPLE_REQUERIMIENTOS"

	val HORA_DE_APERTURA = 9
	val HORA_DE_CIERRE = 22

	@Check
	def horaInicio(Asignacion asignacion) {
		if (asignacion.horaInicio >= HORA_DE_CIERRE)
			error('La hora de inicio debe ser menor a ' + HORA_DE_CIERRE, asignacion,
				PlanificacionPackage.Literals.ASIGNACION__HORA_INICIO, HORA_INICIO_MAYOR_IGUAL_HORA_FIN)
	}

	@Check
	def horaFin(Asignacion asignacion) {
		if (asignacion.horaFin <= HORA_DE_APERTURA)
			error('La hora de inicio debe ser mayor a ' + HORA_DE_APERTURA, asignacion,
				PlanificacionPackage.Literals.ASIGNACION__HORA_FIN, HORA_INICIO_MAYOR_IGUAL_HORA_FIN)
	}

	@Check
	def horaInicioMayorIgualHoraFin(Asignacion asignacion) {
		if (asignacion.horaInicio >= asignacion.horaFin)
			error('La hora de inicio debe ser menor a ' + HORA_DE_CIERRE, asignacion,
				PlanificacionPackage.Literals.ASIGNACION__HORA_FIN, HORA_INICIO_MAYOR_IGUAL_HORA_FIN)
	}

	@Check
	def facultadEstaAbierta(Asignacion asignacion) {
		validarHorario(asignacion, asignacion.horaInicio, PlanificacionPackage.Literals.ASIGNACION__HORA_INICIO)
		validarHorario(asignacion, asignacion.horaFin, PlanificacionPackage.Literals.ASIGNACION__HORA_FIN)
	}

	@Check
	def seCumplenLosRequisitos(Asignacion asignacion) {
		val requisitos = asignacion.materia.requisitos
		val recursos = asignacion.aula.recursos
		val faltantes = requisitos.filter[req|!recursos.contains(req)]

		if (!faltantes.empty)
			error('El aula no cumple los requisitos de la materia.\nFalta: ' + faltantes.join(', '), asignacion,
				PlanificacionPackage.Literals.ASIGNACION__AULA, AULA_NO_CUMPLE_REQUERIMIENTOS)
	}

	def validarHorario(Asignacion asignacion, int hora, EAttribute ea) {
		if (hora < HORA_DE_APERTURA || hora > HORA_DE_CIERRE)
			error('La facultad esta abierta de 9 a 22 Hs.', asignacion, ea, HORARIO_DE_ASIGNACION_INVALIDO)
	}
}
